package online.foxnull2.foxmall.order.config;

import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.util.FileCopyUtils;

import javax.annotation.PostConstruct;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;

@Slf4j
@Configuration
public class AlipayEasyConfig {

    @PostConstruct
    public void setOptions() throws IOException {
        Factory.setOptions(getOptions());
    }

    private static Config getOptions() throws IOException {
        Config config = new Config();
        config.protocol = "https";
        config.gatewayHost = "openapi.alipaydev.com";
        config.signType = "RSA2";

//        config.appId = "<-- 请填写您的AppId，例如：2019091767145019 -->";
        config.appId = "2021000118628485";


        // 为避免私钥随源码泄露，推荐从文件中读取私钥字符串而不是写入源码中
//        config.merchantPrivateKey = "<-- 请填写您的应用私钥，例如：MIIEvQIBADANB ... ... -->";
//        File file = ResourceUtils.getFile("classpath:foo/privateKey");
//        config.merchantPrivateKey = Files.readString(file.toPath());
        Resource resource = new ClassPathResource("classpath:foo/privateKey");
        InputStream inputStream = resource.getInputStream();
        try {
            byte[] bytes = FileCopyUtils.copyToByteArray(inputStream);
            config.merchantPrivateKey = new String(bytes, StandardCharsets.UTF_8);
        } catch (IOException e) {
            log.warn("IOException", e);
        }

        //注：证书文件路径支持设置为文件系统中的路径或CLASS_PATH中的路径，优先从文件系统中加载，加载失败后会继续尝试从CLASS_PATH中加载
//        config.merchantCertPath = "<-- 请填写您的应用公钥证书文件路径，例如：/foo/appCertPublicKey_2019051064521003.crt -->";
//        config.alipayCertPath = "<-- 请填写您的支付宝公钥证书文件路径，例如：/foo/alipayCertPublicKey_RSA2.crt -->";
//        config.alipayRootCertPath = "<-- 请填写您的支付宝根证书文件路径，例如：/foo/alipayRootCert.crt -->";
        config.merchantCertPath = "foo/appCertPublicKey_2021000118628485.crt";
        config.alipayCertPath = "foo/alipayCertPublicKey_RSA2.crt";
        config.alipayRootCertPath = "foo/alipayRootCert.crt";

        //注：如果采用非证书模式，则无需赋值上面的三个证书路径，改为赋值如下的支付宝公钥字符串即可
        // config.alipayPublicKey = "<-- 请填写您的支付宝公钥，例如：MIIBIjANBg... -->";

        //可设置异步通知接收服务地址（可选）
//        config.notifyUrl = "<-- 请填写您的支付类接口异步通知接收服务地址，例如：https://www.test.com/callback -->";

        //可设置AES密钥，调用AES加解密相关接口时需要（可选）
//        config.encryptKey = "<-- 请填写您的AES密钥，例如：aa4BtZ4tspm2wnXLb1ThQA== -->";

        return config;
    }
}
